#include "UDP.h"

int main(int argc, char const *argv[])
{ // 判断是否有按格式输入
    ARGV_IF(argc, 3);

    // 初始化变量
    int soc = 0; // 套接字
    // 服务器网络信号结构体
    struct sockaddr_in serve_Ip_Port;
    // 客户端初始化
    serve_Ip_Port = UDP_Init_Client(htons(atoi(argv[1])), argv[2], &soc);
    // 服务器结构体长度
    socklen_t Serve_sock_len = sizeof(serve_Ip_Port);

    // 发送传输文件请求
    // 文件内容应答结构体初始化
    file_data_str File_DATA;
    File_DATA.SYN = 1;
    sendto(soc, &File_DATA, sizeof(File_DATA), 0, (struct sockaddr *)&serve_Ip_Port, Serve_sock_len);
    printf("已发送文件传输连接请求\n");
    // 接收服务端传来的文件目录
    memset(&File_DATA, 0, sizeof(File_DATA));
    recvfrom(soc, &File_DATA, sizeof(File_DATA), 0, (struct sockaddr *)&serve_Ip_Port, &Serve_sock_len);
    printf("1111\n");
    if (File_DATA.num >= 2)
    {
        printf("%s", File_DATA.buff);
    }

    // 发送要下载的指定文件名
    // 指定下载文件的缓存数组
    char buf[128];
    printf("请输入要下载的文件名\n");
    scanf("%s", buf);
    strcpy(File_DATA.buff, buf);
    File_DATA.SYN = 2;
    File_DATA.num = 1;
    sendto(soc, &File_DATA, sizeof(File_DATA), 0, (struct sockaddr *)&serve_Ip_Port, Serve_sock_len);

    // 接收每次传来的文件内容并下载
    int fd = open("HQYJ.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);
    int m =1;
    while (1)
    {
        memset(&File_DATA, 0, sizeof(File_DATA));
        recvfrom(soc, &File_DATA, sizeof(File_DATA), 0, (struct sockaddr *)&serve_Ip_Port, &Serve_sock_len);
        if (File_DATA.SYN == 9)//清空文件
        {  
             //关闭文件
            close(fd);
            //已清空文件模式再次打开文件
           fd = open("HQYJ.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);
        }
        
        if (File_DATA.num > 0)
        {
            write(fd, File_DATA.buff, File_DATA.num);
        }
        // printf("次数=%d 大小 = %d\n",m , File_DATA.num);
        sendto(soc, &File_DATA, sizeof(File_DATA), 0, (struct sockaddr *)&serve_Ip_Port, Serve_sock_len);
        m++;
        if (File_DATA.num == 0)
        {
            printf("传输完成\n");
            break;
        }
        
    }
    close(fd);

    // 关闭套接字
    close(soc);
    return 0;
}
